# -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt

# 傅里叶分析博文高赞：zhuanlan.zhihu.com/p/19763358
# 傅里叶的作用
# 高频：变化剧烈地灰度分量，例如边界
# 低频：变化缓慢的灰度分量，例如一片大海

# 滤波
# 低通滤波器：只保留低频，图像会变得更模糊
# 高通滤波器：只保留高频，图像细节增强

# opencv中主要是cv2.dft()和cv2.idtf(),输入图像要先转换为np.float32格式
# 得到结果中的频率为0的部分会在左上角，通常需要转换到中心位置，可以通过shift变换来实现
# cv2.dft()返回的结果是双通道的(实部，虚部)，通常还需要转换为图像格式才能展示(0,255)
###1、傅里叶变化
img = cv2.imread('lena.jpg',0)
img_float32 = np.float32(img)
dft = cv2.dft(img_float32,flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
#得到灰度图能表示的形式
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
#原图
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Tnput Image'),plt.xticks([]),plt.yticks([])
#傅里叶变换后的图像
#中间的白表示低频部分，
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'),plt.xticks([]),plt.yticks([])
plt.savefig('01fft.png')
plt.show()

